/*******************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
package org.spiffyui.spiffyforms.client;
import java.util.ArrayList;
import java.util.Date;
import org.spiffyui.client.JSONUtil;
import org.spiffyui.client.MessageUtil;
import org.spiffyui.client.rest.RESTCallback;
import org.spiffyui.client.rest.RESTException;
import org.spiffyui.client.rest.RESTObjectCallBack;
import org.spiffyui.client.rest.RESTility;
import com.google.gwt.http.client.URL;
import com.google.gwt.json.client.JSONArray;
import com.google.gwt.json.client.JSONObject;
import com.google.gwt.json.client.JSONString;
import com.google.gwt.json.client.JSONValue;
/**
* This class is our RESTBean for managing users. It handles create, read, update, and
* delete of users from the server. This class encapsulates all of the REST functions
* of our application and is responsible for turning JSON data into a Java object.
*/
class User
{
private String m_firstName = "";
private String m_lastName = "";
private String m_email = "";
private String m_password = "";
private Date m_bDay = null;
private String m_userDesc = "";
private String m_userId = "";
private String m_gender = "male";
private boolean m_isNew = true;
public String getFirstName()
{
return m_firstName;
}
public void setFirstName(String s)
{
m_firstName = s;
}
public String getLastName()
{
return m_lastName;
}
public void setLastName(String s)
{
m_lastName = s;
}
public String getEmail()
{
return m_email;
}
public void setEmail(String s)
{
m_email = s;
}
public String getPassword()
{
return m_password;
}
public void setPassword(String s)
{
m_password = s;
}
public String getUserDesc()
{
return m_userDesc;
}
public void setUserDesc(String s)
{
m_userDesc = s;
}
public Date getBirthday()
{
return m_bDay;
}
public void setBirthday(Date d)
{
m_bDay = d;
}
public String getUserId()
{
return m_userId;
}
public void setUserId(String id)
{
m_userId = id;
}
public String getGender()
{
return m_gender;
}
public void setGender(String gender)
{
m_gender = gender;
}
public boolean isNew()
{
return m_isNew;
}
/**
* Get the list of users from the server
*
* @param callback the callback for getting the list of users
*/
public static void getUsers(final RESTObjectCallBack<User[]> callback)
{
RESTility.callREST("api/users", new RESTCallback() {
@Override
public void onSuccess(JSONValue val)
{
JSONArray usersArray = val.isArray();
ArrayList<User> users = new ArrayList<User>();
for (int i = 0; i < usersArray.size(); i++) {
if (usersArray.get(i).isNull() != null) {
continue;
}
User u = new User();
u.setFirstName(JSONUtil.getStringValue(usersArray.get(i).isObject(), "firstName"));
u.setLastName(JSONUtil.getStringValue(usersArray.get(i).isObject(), "lastName"));
u.setPassword(JSONUtil.getStringValue(usersArray.get(i).isObject(), "password"));
u.setUserId(JSONUtil.getStringValue(usersArray.get(i).isObject(), "userID"));
u.setEmail(JSONUtil.getStringValue(usersArray.get(i).isObject(), "email"));
u.setUserDesc(JSONUtil.getStringValue(usersArray.get(i).isObject(), "desc"));
u.setGender(JSONUtil.getStringValue(usersArray.get(i).isObject(), "gender"));
u.setBirthday(JSONUtil.getDateValue(usersArray.get(i).isObject(), "birthday"));
u.m_isNew = false;
users.add(u);
}
callback.success(users.toArray(new User[users.size()]));
}
@Override
public void onError(int statusCode, String errorResponse)
{
callback.error(errorResponse);
}
@Override
public void onError(RESTException e)
{
callback.error(e);
}
});
}
/**
* Save the specified user to the server. This method handles new users as well as updating
* existing users.
*
* @param callback the callback to get the status of the save operation
*/
public void save(final RESTObjectCallBack<Boolean> callback)
{
JSONObject user = new JSONObject();
user.put("firstName", new JSONString(getFirstName()));
user.put("lastName", new JSONString(getLastName()));
user.put("email", new JSONString(getEmail()));
user.put("birthday", new JSONString("" + getBirthday().getTime()));
user.put("desc", new JSONString(getUserDesc()));
user.put("gender", new JSONString(getGender()));
user.put("password", new JSONString(getPassword()));
user.put("userID", new JSONString(getUserId()));
RESTility.HTTPMethod m = RESTility.PUT;
if (m_isNew) {
/*
If this user has never been saved then we need
to use a POST instead of a PUT
*/
m = RESTility.POST;
}
RESTility.callREST(getURIForID(getUserId()), user.toString(), m, new RESTCallback() {
@Override
public void onSuccess(JSONValue val)
{
m_isNew = false;
callback.success(Boolean.TRUE);
}
@Override
public void onError(int statusCode, String errorResponse)
{
callback.error(errorResponse);
}
@Override
public void onError(RESTException e)
{
callback.error(e);
}
});
}
/**
* Delete this user from the server.
*
* @param callback the callback to indicate the success of the delete call
*/
public void delete(final RESTObjectCallBack<Boolean> callback)
{
RESTility.callREST(getURIForID(getUserId()),
null, RESTility.DELETE, new RESTCallback() {
@Override
public void onSuccess(JSONValue val)
{
callback.success(Boolean.TRUE);
}
@Override
public void onError(int statusCode, String errorResponse)
{
MessageUtil.showError("Error. Status Code: " + statusCode + " " + errorResponse);
}
@Override
public void onError(RESTException e)
{
MessageUtil.showError(e.getReason());
}
});
}
/**
* This is a helper function to determine if the specified username is in use. It makes
* a GET call to get the specified user information and returns true if the username is
* already used and false otherwise.
*
* @param callback the callback
* @param username the username to check
*/
public static void isUsernameInUse(final RESTObjectCallBack<Boolean> callback, String username)
{
RESTility.callREST(getURIForID(username),
new RESTCallback() {
@Override
public void onSuccess(JSONValue val)
{
callback.success(Boolean.TRUE);
}
@Override
public void onError(int statusCode, String errorResponse)
{
callback.error(errorResponse);
}
@Override
public void onError(RESTException e)
{
if (e.getCode().equals("Not Found")) {
/*
Then our username doesn't exist on the server which means the
name isn't in use.
*/
callback.success(Boolean.FALSE);
} else {
callback.error(e);
}
}
});
}
private static String getURIForID(String userid)
{
return "api/users/" + URL.encodePathSegment(userid);
}
}